package threads;


import gui.Nivel;
import gui.Supervisor;

import java.util.LinkedList;
import java.util.Random;

import java.util.List;

import javax.swing.JLabel;

public class ThreadMoverEnemigo extends Thread {
	
	protected Supervisor sup;
	protected Random gen;
	protected boolean terminar;
	protected List<JLabel> enEspera;
	protected int anchoDeCasillero;
	protected Nivel nivel;
	protected List<JLabel> aRemover;
	protected List<JLabel> aEliminar;
	protected int vel;
	
	public ThreadMoverEnemigo(Supervisor s,Nivel n,int v)
	{
		gen = new Random();
		sup = s;
		terminar = false;
		enEspera = new LinkedList<JLabel>();
		aRemover = new LinkedList<JLabel>();
		aEliminar = new LinkedList<JLabel>();
		nivel = n;
		anchoDeCasillero = nivel.anchoDeCasillero();
		vel = v;
	}
	
	public void run()
	{
		List<JLabel> aMover = new LinkedList<JLabel>();
		while(!terminar)
		{
			int index = 0; //Usado para recorrer la lista en espera.
			while(index < enEspera.size() && !terminar)
			{
				JLabel label = enEspera.get(index);
				int i = sup.moverse(label);
				//sup.bloquear(label);
				if (i == 0)
				{
					enEspera.remove(index);
					aMover.add(label);
				}
				else
				{
					if (i == 2)
					{
						aRemover.add(label);
						enEspera.remove(index);
					}
					else 
					{
						if (i == 1)
						{
							sup.peleaEnemigo(label);
						}
						index++;
					}
				}
			}
				
			for(JLabel label: aRemover) //Remuevo los enemigo que llegaron al final de la pantalla
			{
				sup.llegoEnemigoAlFinal(label);
				nivel.quitarLabel(label);
			}
			aRemover.clear();
			
			int cantIteraciones = 1;
			while (aMover.size() > 0 && !terminar)
			{
				index = 0; //usado para recorer la lista de labels a mover
				while (index < aMover.size() && !terminar)
				{
					JLabel label = aMover.get(index);
					int cantMov = sup.cantMov(label);
			//		int ancho = label.getWidth();
					int anchoCas = nivel.anchoDeCasillero();
					if((cantMov * cantIteraciones) <= anchoCas)
					{
						moverUnidad(label, cantMov);
						index++; //Solo tengo que incrementar el indice si movi
					}
					else
						enEspera.add(aMover.remove(index)); //Porque si elimino, el indice me puede quedar fuera de rango
				}
				
				try {
					Thread.sleep(50);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				cantIteraciones++;
			}
			aMover.clear();
			
			for(JLabel label: aEliminar) //Remuevo los enemigo que murieron
			{
				if(enEspera.contains(label))
				{
					enEspera.remove(label);
				}
				sup.noExisteMas(label);
				nivel.quitarLabel(label);
			}
			aEliminar.clear();
				
		}
	}
	
	public void terminar()
	{
		terminar = true;
	}
	
	public void nuevoEnemigo(JLabel e)
	{
		enEspera.add(e);
	}
	
	
	public void moverUnidad(JLabel l, int mov)
	{
		l.setLocation((l.getLocation().x)-mov, l.getLocation().y);
	}
	
	public void eliminar(JLabel unidad)
	{
		aEliminar.add(unidad);
	}
}
